import { defineStore } from 'pinia';
import { getToken, removeToken, setToken } from '../utils/token-utils';
import { ElMessage } from 'element-plus'
//引入静态路由表
import { staticRoutes } from '@/router/routes'
//引入静态路由表类型
import type { RouteRecordRaw } from 'vue-router';
//引入类型
import type { reqUserInfoReturnType , reqLoginParamsType} from "@/api/userInfo"
//引入api请求
import {requestLogin , requestUserInfo , requestLogout} from "@/api/userInfo"


/**
 * 用户信息
 * @methods setUserInfos 设置用户信息
 */
//我们自己定义用户信息模块的数据的返回值
export interface userInfoStateType {
  token: string;
  userInfo: reqUserInfoReturnType;
  menuRoutes: RouteRecordRaw[];
}
export const useUserInfoStore = defineStore('userInfo', {

  state: (): userInfoStateType => ({
    token: getToken() as string,
    userInfo: {
      routes: [],
      buttons: [],
      roles: [],
      name: "",
      avatar: "",
    },
    //保存静态路由表，为了在侧边栏遍历生成元素
    menuRoutes: staticRoutes,
  }),

  actions: {
    //1.登录请求的方法
    async login(userParams: reqLoginParamsType){
      try {
        //发送登录请求
        const result = await requestLogin(userParams)
        //把请求回来的用户的token保存在状态中
        this.token = result.token
        //登录状态持久化
        setToken(this.token)
      }catch(e) {
        //返回失败的Promise实例为了,以后在哪里调用这个方法出现异常，就在哪里处理异常
        return Promise.reject(e)
      }
    },

    //2.获取用户信息请求
    async getuserInfo(){
      try {
        //发送获取用户信息请求
        const result = await requestUserInfo()
        //把请求回来的用户信息保存在sate中
        this.userInfo = result
      }catch(e) {
        //抛出异常
        return Promise.reject(e)
      }
    },

    //3.退出登录请求
    async getLogout(){
      try {
        //发送退出登录请求
        await requestLogout()
        //清空本地token和用户信息
        this.reset()
      }catch(e) {
        //抛出异常
        return Promise.reject(e)
      }
    },

    //4.清空用户信息
    reset() {
      // 删除local中保存的token
      removeToken()
      // 提交重置用户信息的mutation
      this.token = ''
      this.userInfo = {
        routes: [],
        buttons: [],
        roles: [],
        name: "",
        avatar: "",
      }
    },
  },
});
